package logger.sd.client;

import org.apache.log4j.Level;

import logger.sd.protocol.LRP;
import logger.sd.util.AbstractLogger;

/**
 * 
 * Classe ClientLogger
 * 
 * Esta classe encaminha as requisicoes de logging vindas do Cliente para o
 * Servidor.
 * 
 * @author wendell
 */
public class ClientLogger extends AbstractLogger {

	private static ClientLogger instance = null;
	private static final String logRequest = LRP.LOG.getMessage()+':';
	
	private LoggerConnector connector;
	private String resposta;

	protected Level level; // level para o servidor

	/**
	 * Construtor privado. Singleton
	 * 
	 * @exception LoggerNotAvailableExcpetion
	 */
	private ClientLogger() {
		level = Level.WARN;
	}

	/**
	 * Retorna a instancia do logger
	 * 
	 * @return Instancia do logger
	 */
	public static ClientLogger getInstance() {
		if (instance == null) {
			instance = new ClientLogger();
		}
		return (ClientLogger) instance;
	}
	
	/**
	 * Conecta o cliente de log ao servidor.
	 * @param host
	 * @param port
	 */
	public void connect(String host, int port) {
		connector = new LoggerConnector(host, port);
	}

	/**
	 * Escreve no log
	 * 
	 * @param level
	 *            Nivel de log da mensagem que sera enviada
	 * @param message
	 *            Mensagem que sera enviada
	 */
	public void log(Level level, String message) {
		String result = new String(message);
		if (level.isGreaterOrEqual(this.level)) {
			String request = logRequest + level + " \"" + message+ "\"";
			connector.send(request);
			resposta = connector.receive();
			// se nao obteve sucesso...
			if (!resposta.endsWith(LRP.MENSAGEM_00.getMessage())) {
				result += " -> " + resposta;
			}
		}
	}
	
	/**
	 * Termina a conexao com o servidor
	 */
	public void end() {
		resposta = connector.close();
	}

	/**
	 * Seta o Level do log no servidor
	 * 
	 * @param level
	 *            Nivel que sera configurado no servidor
	 */
	public void setLevel(Level level) {
		this.level = level;
	}

	/**
	 * Retorna a ultima resposta do servidor à solicitacao do cliente
	 * 
	 * @return Resposta do servidor
	 */
	@Deprecated
	public String getResposta() {
		return this.resposta;
	}

}
